import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

# 1. 读取训练数据
train_data = pd.read_excel('合并数据集.xlsx')
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用SimHei字体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号
# 2. 提取所需特征和目标变量
material = pd.Categorical(train_data['材料']).codes  # 材料：材料1、材料2、材料3、材料4
temperature = train_data['温度，oC']                      # 温度：25、50、70、90摄氏度
frequency = train_data['频率，Hz']                        # 频率：50000—500000 Hz#比赛结束前最后一天售后群发布无水印可视化结果+无标注代码【可直接提交】为了防止倒卖， 论文写作过程中遗留数个致命问题，无关代码，该问题解决方式仅在官网授权售后群答疑，盗卖方式购买资料不提供答疑，感谢理解2024年研赛资料助攻购买链接+说明https://docs.qq.com/doc/p/e03d6bffc00b392932b7dc1fbcf746ef9b086a8a
core_loss = train_data['磁芯损耗，w/m3']                        # 磁芯损耗，目标变量
waveform = pd.Categorical(train_data['励磁波形']).codes   # 励磁波形：正弦波、三角波、梯形波

# 3. 构建特征矩阵（输入变量）
X_train = np.column_stack((material, temperature, frequency, waveform))

# 4. 构建随机森林模型来预测磁芯损耗
model = RandomForestRegressor(n_estimators=100, random_state=1, min_samples_leaf=5)
model.fit(X_train, core_loss)

# 5. 输出袋外均方误差（OOB Error）来评估模型的泛化能力
# 注意：sklearn 的随机森林没有直接的 OOB Error 输出，可以使用交叉验证来评估模型。
# 这里不进行 OOB Error 的绘制，您可以自行实现交叉验证评估。

# 6. 读取测试数据
# 读取测试数据
test_data = pd.read_excel('附件三（测试集）.xlsx')

# 打印测试数据的列名以确认
print(test_data.columns)

# 确保提取的列名正确
# 读取测试数据#比赛结束前最后一天售后群发布无水印可视化结果+无标注代码【可直接提交】为了防止倒卖， 论文写作过程中遗留数个致命问题，无关代码，该问题解决方式仅在官网授权售后群答疑，盗卖方式购买资料不提供答疑，感谢理解2024年研赛资料助攻购买链接+说明https://docs.qq.com/doc/p/e03d6bffc00b392932b7dc1fbcf746ef9b086a8a
test_data = pd.read_excel('附件三（测试集）.xlsx')

# 确保提取的列名正确
material_test = pd.Categorical(test_data['磁芯材料']).codes  # 修改为'磁芯材料'
temperature_test = test_data['温度，oC']                        # 确保匹配
frequency_test = test_data['频率，Hz']                          # 确保匹配
waveform_test = pd.Categorical(test_data['励磁波形']).codes     # 确保匹配



# 8. 构建测试数据的特征矩阵
X_test = np.column_stack((material_test, temperature_test, frequency_test, waveform_test))

# 9. 使用训练好的模型对测试数据进行预测
core_loss_pred = model.predict(X_test)

# 10. 保存预测结果为 Excel 文件
predicted_core_loss_table = pd.DataFrame(core_loss_pred, columns=['PredictedCoreLoss'])
predicted_core_loss_table.to_excel('问题四预测磁芯损耗结果简单结果.xlsx', index=False)

print('预测结果已成功保存为 问题四预测磁芯损耗结果简单结果.xlsx')

# 11. 可视化预测结果
plt.figure()
plt.plot(core_loss_pred, 'r-', linewidth=1.5)
plt.xlabel('样本编号')#比赛结束前最后一天售后群发布无水印可视化结果+无标注代码【可直接提交】为了防止倒卖， 论文写作过程中遗留数个致命问题，无关代码，该问题解决方式仅在官网授权售后群答疑，盗卖方式购买资料不提供答疑，感谢理解2024年研赛资料助攻购买链接+说明https://docs.qq.com/doc/p/e03d6bffc00b392932b7dc1fbcf746ef9b086a8a
plt.ylabel('预测磁芯损耗 (W/m^3)')
plt.title('磁芯损耗预测结果')
plt.grid(True)
plt.legend(['预测磁芯损耗'])
plt.show()
